package Demo1;

//逆波兰表达式

import java.util.Arrays;
import java.util.Stack;

/**
 * 有效的算符为 '+'、'-'、'*' 和 '/' 。
 * 每个操作数（运算对象）都可以是一个整数或者另一个表达式。
 * 两个整数之间的除法总是 向零截断 。
 * 表达式中不含除零运算。
 * 输入是一个根据逆波兰表示法表示的算术表达式。
 * 答案及所有中间计算结果可以用 32 位 整数表示。
 */

//怎么把String转换为int？

class Solution3 {
    //用栈来解决
    //当遇到符号要入栈时，把前两个数字提取出来进行运算，然后再将结果入栈
    public int evalRPN(String[] tokens) {
        Stack<String> stack = new Stack<>();
        for (int i = 0; i < tokens.length; i++) {
            if (tokens[i].matches("\\d+") || tokens[i].matches("-\\d+")) {
                stack.push(tokens[i]);
            } else {
                switch (tokens[i]) {
                    case "+" -> {
                        int y = Integer.parseInt(stack.pop());
                        int x = Integer.parseInt(stack.pop());
                        stack.push(Integer.toString(x + y));
                    }
                    case "-" -> {
                        int y = Integer.parseInt(stack.pop());
                        int x = Integer.parseInt(stack.pop());
                        stack.push(Integer.toString(x - y));
                    }
                    case "*" -> {
                        int y = Integer.parseInt(stack.pop());
                        int x = Integer.parseInt(stack.pop());
                        stack.push(Integer.toString(x * y));
                    }
                    case "/" -> {
                        int y = Integer.parseInt(stack.pop());
                        int x = Integer.parseInt(stack.pop());
                        stack.push(Integer.toString(x / y));
                    }
                }
            }
        }

        return Integer.parseInt(stack.pop());
    }
}

public class t3 {
    public static void main(String[] args) {
        String[] strings = {"10","6","9","3","+","-11","*","/","*","17","+","5","+"};
        Solution3 s = new Solution3();
        System.out.println(s.evalRPN(strings));
    }
}
